<!DOCTYPE html>
<html>
<head>
  <title>Document::nodesFromRect test - bug 40197</title>
  <style type="text/css"> @import "resources/nodesFromRect.css"; </style>
  <script src="../../../resources/js-test.js"></script>
  <script src="resources/nodesFromRect.js"></script>
  <script type="application/javascript">
    function runTest()
    {
      var e = {};

      // Set up shortcut access to elements
      e['html'] = document.getElementsByTagName("html")[0];
      ['h1', 'd1', 'd2', 'p1', 'p2', 'p3', 'p4', 'p5', 'span', 'body'].forEach(function(a) {
        e[a] = document.getElementById(a);
      });

      window.scrollTo(0, 0);

      check(53, 71, 1, 1, [e.body]);
      check(53, 61, 1, 11, [e.h1, e.body]);
      check(53, 71, 11, 1, [e.p3, e.body]);
      check(53, 71, 1, 11, [e.d1, e.body]);
      check(43, 71, 11, 1, [e.body]);
      check(43, 71, 21, 1, [e.p3, e.body]);
      check(53, 61, 1, 21, [e.d1, e.h1, e.body]);
      check(43, 61, 21, 21, [e.p3, e.d1, e.h1, e.body]);

      check(152, 95, 1, 11, [e.p3, e.body]);
      check(152, 105, 11, 1, [e.p4, e.body]);
      check(152, 105, 1, 11, [e.body]);
      check(142, 105, 11, 1, [e.d1, e.body]);
      check(152, 95, 1, 21, [e.p3, e.body]);
      check(142, 105, 21, 1, [e.p4, e.d1, e.body]);
      check(142, 95, 21, 21, [e.p4, e.p3, e.d1, e.body]);

      // e.p1 is invisible and shouldn't appear:
      check(153, 193, 1, 1, [e.p5]);
      // NOTE: [e.p5, e.d2]) should be returned if we did not stop
      // at e.p5, which fully encloses the target rect.
      check(133, 193, 41, 1, [e.p5]);
      check(153, 173, 1, 41, [e.p5, e.body]);

      check(77, 240, 1, 1, [e.p2]);
      check(77, 239, 1, 2, [e.p5, e.p2]);
      check(77, 240, 1, 2, [e.span, e.p2]);
      check(77, 239, 1, 3, [e.p5, e.span, e.p2]);

      // Precise pixel checks:
      check(144, 183, 1, 1, [e.body]);
      check(144, 182, 1, 3, [e.p5, e.body]);
      check(143, 183, 3, 1, [e.d2, e.body]);
      check(144, 183, 1, 2, [e.p5, e.body]);
      check(143, 183, 2, 1, [e.d2, e.body]);
      check(143, 183, 2, 2, [e.p5, e.d2, e.body]);
      check(143, 182, 3, 3, [e.p5, e.d2, e.body]);
      check(77, 240, 1, 1, [e.p2]);
      check(76, 240, 3, 1, [e.p2]);
      check(77, 239, 1, 2, [e.p5, e.p2]);
      check(77, 240, 1, 2, [e.span, e.p2]);
      check(77, 239, 1, 3, [e.p5, e.span, e.p2]);
      check(76, 239, 3, 3, [e.p5, e.span, e.p2]);

      // Expanding area checks:
      check(39, 212, 1, 1, [e.body]);
      check(39, 202, 1, 11, [e.d2, e.body]);
      check(39, 212, 1, 11, [e.p2, e.body]);
      check(39, 202, 2, 41, [e.p2, e.d2, e.body]);
      check(39, 202, 6, 41, [e.span, e.p2, e.d2, e.body]);
      check(39, 202, 16, 41, [e.p5, e.span, e.p2, e.d2, e.body]);
      check(39, 202, 1, 21, [e.d2, e.p2, e.body]);
      check(29, 212, 21, 1, [e.p5, e.body]);
      check(29, 202, 21, 21, [e.p5, e.d2, e.p2, e.body]);
    }
    window.onload = runTest;
  </script>
</head>
<body id="body">
  <h1 id="h1"></h1>
  <div id="d1"></div>

  <!-- floated element -->
  <div id="d2" style="float: left"></div>

  <!-- hidden element -->
  <p id="p1" style="float: left; visibility: hidden"></p>

  <p id="p2" style="clear: left"><span id="span"></span></p>

  <!-- absolute position -->
  <p id="p3" style="position:absolute; top: 10px; left:50px; height:50px;"></p>

  <!-- fixed position -->
  <p id="p4" style="position: fixed; top: 30px; left: 150px; height: 50px; background-color: blue;"></p>

  <!-- relative position -->
  <p id="p5" style="position:relative; top: -100px; left: 30px; margin-bottom: -70px; background-color: green"></p>

  <span id="console"></span>
</body>
</html>
